let logger = require('./logger.js')
let TRUE = 1
let FALSE = 0
//校验json请求参数
function checkParameters(check, jsonData) {

    let flag = 1
    let i = 0
    for (let key in jsonData) {
        if (key != check[i]) {
            flag = 0
        }
        i++
    }
    return flag
}
//图片写入
function pictureStorage(dataBuffer, urlPath, picName) {
  return new Promise((resolve, reject) => {
        fs.writeFile((urlPath + picName + '.jpg'), dataBuffer, (err) => {
            if(err){
                logger.error('error', err)
                resolve(FALSE)
            }else{
                resolve(TRUE)
            }
        })
    })
}

//图片操作
function startPictureOperations(base64URL, urlPath, picName) {
  return new Promise((resolve, reject) => {
        let base64 = base64URL.replace(/^data:image\/\w+base64,/, "") //去掉图片base64码前面部分data:image/pngbase64
        let dataBuffer = Buffer.from(base64, 'base64') 
        fs.stat(urlPath, (err) => {
            if (!err) {
                logger.debug('debug', "Folder path exists")
                resolve(pictureStorage(dataBuffer, urlPath, picName, fs))
            }
            else if (err.code === 'ENOENT') {
                logger.error('error', "The specified directory does not exist" + err)
                fs.mkdir(urlPath, { recursive:true }, function(err) {
                    if(!err) {
                        logger.debug('debug', "Directory created successfully")
                        resolve(pictureStorage(dataBuffer, urlPath, picName))
                    }
                })
            } else {
              logger.error('error', err)
              resolve(err)
            }
        })
    })
}
//异步操作数据库并获取执行结果
function startOperations(pool, sql) {
     return new Promise((resolve, reject) => {
        logger.debug('debug', sql)
        console.log(pool)
        pool.getConnection((err, conn) => {
            if (err) {
                logger.error('error', err)
                resolve(FALSE)
            } else {
                conn.query(sql,
                    function(err, data) {
                        if (err) {
                          console.log(sql)
                            logger.error('error', err)
                            resolve(FALSE)
                        } else {
                            //新版数据库查询出的数据格式与老版mysql的数据不同。
                        //    RowDataPacket {
                        //     feedbackContent: '软件慢',
                        //     userId: '77',
                        //     feedbackStatus: '未处理',
                        //     feedbackDate: 2022-01-24T16:00:00.000Z,
                        //     feedbackId: 2
                        //   }
                        // ]
                        console.log(data)
                            logger.debug('debug', data)
                            resolve(data[1])
                        }
                    })
            }
            conn.release()
        })
    })
}
//执行sql事务
function startTransaction(pool, sqls, params) {
     return new Promise((resolve, reject) => {
      pool.getConnection(function (err, conn) {
        // 连接失败 promise直接返回失败
        if (err) {
          logger.error('error', err)
          reject(err)
        }
        // 如果 语句和参数数量不匹配 promise直接返回失败
        if (sqls.length !== params.length) {
          conn.release() // 释放掉
          reject(new Error("语句与参数数量不匹配"))
        }
        // 开始执行事务
        conn.beginTransaction((beginErr) => {
          // 创建事务失败
          if (beginErr) {
            conn.release()
            console.log(beginErr)
            reject(beginErr)
          }
          logger.debug('debug', "开始执行事务，共执行" + sqls.length + "条语句")
          // 返回一个promise 数组
          let funcAry = sqls.map((sql, index) => {
              return new Promise((sqlResolve, sqlReject) => {
              const data = params[index]
              logger.debug('debug', data)
              conn.query(sql, data, (sqlErr, result) => {
                if (sqlErr) {
                  logger.debug('debug', sqlErr)
                  sqlReject(sqlErr)
                }
                console.log('debug', sql)
                logger.debug('debug', result)
                sqlResolve(result)   
              })
            })
          })
          // 使用all 方法 对里面的每个promise执行的状态 检查
          logger.debug('debug', funcAry)
          Promise.all(funcAry)
            .then((arrResult) => {
              // 若每个sql语句都执行成功了 才会走到这里 在这里需要提交事务，前面的sql执行才会生效
              // 提交事务
              conn.commit(function (commitErr, info) {
                if (commitErr) {
                  // 提交事务失败了
                  logger.debug('debug', commitErr);
                  // 事务回滚，之前运行的sql语句不生效
                  conn.rollback(function (err) {
                    if (err) logger.error('error', "回滚失败：" + err)
                    conn.release()
                  })
                  // 返回promise失败状态
                   reject(commitErr)
                }
  
                conn.release()
                // 事务成功 返回 每个sql运行的结果 是个数组结构
                logger.debug('debug', "事务成功")
                resolve(arrResult)
              })
            })
            .catch((err) => {
              // 多条sql语句执行中 其中有一条报错 直接回滚
              conn.rollback(function () {
                logger.error('error', err)
                conn.release()
                reject(err)
              })
            })
        })
      })
    })
  }


module.exports = {
    startTransaction,
    startOperations,
    startPictureOperations,
    checkParameters
}
